import axios from 'axios'
import router from '@/router'
import { Message } from 'element-ui'

// 消息提示管理器 - 防止重复显示相同错误消息
const MessageManager = {
  timer: null,
  lastMessage: '',
  
  showMessage(message, type = 'error') {
    if (this.lastMessage === message && this.timer) {
      return; // 避免重复显示相同消息
    }
    
    // 清除之前的timer
    if (this.timer) {
      clearTimeout(this.timer);
    }
    
    // 保存当前消息
    this.lastMessage = message;
    
    // 显示消息
    Message({
      message,
      type,
      duration: 3000
    });
    
    // 设置定时器，3秒后重置
    this.timer = setTimeout(() => {
      this.lastMessage = '';
      this.timer = null;
    }, 3000);
  }
};

// 创建 axios 实例
const service = axios.create({
  baseURL: '/api', // 使用相对路径，配合Vue代理或Nginx转发
  timeout: 15000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json'
  }
})

// 不需要token的白名单路径
const whiteList = [
  '/user/login', 
  '/user/register', 
  '/user/getEmailCode', 
  '/user/checkEmailCode',
  '/user/password/code',
  '/user/password/reset'
]

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 获取请求路径
    const requestPath = config.url

    // 如果不在白名单中，需要添加token
    if (!whiteList.some(path => requestPath.includes(path))) {
      const token = localStorage.getItem('token')
      if (token) {
        // 从localStorage获取用户信息，确定角色
        let role = 'user' // 默认角色为user
        const userInfoStr = localStorage.getItem('userInfo')
        if (userInfoStr) {
          try {
            const userInfo = JSON.parse(userInfoStr)
            if (userInfo.role === 'admin') {
              role = 'admin'
            }
          } catch (error) {
            console.error('解析用户信息失败:', error)
          }
        }
        
        // 设置token（尝试多种方式）
        // 方式1: 直接设置token头
        config.headers['token'] = token
        config.headers['Token'] = token  // 添加大写的Token头

        // 方式2: 设置Authorization头
        config.headers['Authorization'] = token
        config.headers['Authorization'] = `Bearer ${token}`  // 带Bearer前缀

        // 添加用户角色信息到请求头
        config.headers['role'] = role
        config.headers['Role'] = role  // 也添加大写的Role头
        console.log('添加角色信息:', role)

        // 根据角色设置额外的token header
        if (role === 'admin') {
          config.headers['Admin-Token'] = token
        } else {
          config.headers['User-Token'] = token
        }
      } else {
        // 如果需要token但没有token，拒绝请求
        MessageManager.showMessage('登录已过期，请重新登录')
        router.push('/user/login')
        return Promise.reject(new Error('请先登录'))
      }
    }
    return config
  },
  error => {
    console.error('请求拦截器错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 如果响应类型是blob，直接返回响应数据
    if (response.config.responseType === 'blob') {
      return response.data
    }
    
    const res = response.data
    
    // 如果响应成功，直接返回数据
    if (res.code === 200) {
      return res
    }
    
    // 处理业务错误
    if (res.code === 401) {
      // token 过期或无效
      MessageManager.showMessage(res.message || '登录已过期，请重新登录')
      
      // 在登录或注册页面不进行重定向和token清除
      const currentPath = router.currentRoute.path
      if (!whiteList.includes(currentPath)) {
        // 清除 token
        localStorage.removeItem('token')
        localStorage.removeItem('userInfo')
        // 跳转到登录页
        router.push('/user/login')
      }
      
      return Promise.reject(new Error(res.message || '登录已过期，请重新登录'))
    }
    
    // 其他业务错误
    MessageManager.showMessage(res.message || '操作失败')
    return Promise.reject(new Error(res.message || '操作失败'))
  },
  error => {
    console.error('请求错误:', error)
    
    // 防止重复显示错误信息
    if (error.__HANDLED__) {
      return Promise.reject(error)
    }

    // 处理blob响应的错误
    if (error.request && error.request.responseType === 'blob' && error.response) {
      error.__HANDLED__ = true
      return Promise.reject(error)
    }
    
    // 处理 HTTP 错误
    if (error.response) {
      const currentPath = router.currentRoute.path
      
      switch (error.response.status) {
        case 401: {
          // token 无效或过期
          MessageManager.showMessage(error.response.data?.message || '登录已过期，请重新登录')
          
          // 在登录或注册页面不进行重定向和token清除
          if (!whiteList.includes(currentPath)) {
            // 清除 token
            localStorage.removeItem('token')
            localStorage.removeItem('userInfo')
            // 跳转到登录页
            router.push('/user/login')
          }
          
          error.__HANDLED__ = true
          return Promise.reject(error)
        }
        case 403:
          MessageManager.showMessage('没有权限访问该资源')
          error.__HANDLED__ = true
          return Promise.reject(error)
        case 404:
          MessageManager.showMessage('请求的资源不存在')
          error.__HANDLED__ = true
          return Promise.reject(error)
        case 500:
          MessageManager.showMessage('服务器内部错误')
          error.__HANDLED__ = true
          return Promise.reject(error)
        default:
          MessageManager.showMessage(error.response.data?.message || '请求失败')
          error.__HANDLED__ = true
          return Promise.reject(error)
      }
    }
    
    // 处理网络错误
    if (error.request) {
      MessageManager.showMessage('网络连接失败，请检查网络')
      error.__HANDLED__ = true
      return Promise.reject(error)
    }
    
    // 其他错误
    MessageManager.showMessage('请求失败')
    error.__HANDLED__ = true
    return Promise.reject(error)
  }
)

export default service 